package cn.edu.zjut.medlinebackend.service;

import cn.edu.zjut.medlinebackend.model.Post;
import cn.edu.zjut.medlinebackend.model.dto.PictureEsDTO;
import cn.edu.zjut.medlinebackend.model.dto.PostEsDTO;
import cn.edu.zjut.medlinebackend.model.dto.PostQuery;
import cn.edu.zjut.medlinebackend.model.vo.PostByTagVO;
import cn.edu.zjut.medlinebackend.model.vo.PostVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
* @author 86182
* @description 针对表【post(帖子)】的数据库操作Service
* @createDate 2023-11-21 19:47:27
*/
public interface PostService extends IService<Post> {

    /**
     * 从数据库 根据关键词进行查询
     * @param postQuery
     * @return
     */
    List<Post> getBySearchText(PostQuery postQuery);

    /**
     * 从ES 根据关键词进行查询
     *
     * @param postQuery
     * @return
     */
    Page<PostEsDTO> getPostFromEs(PostQuery postQuery);

    /**
     * 将post对象转化成PostEsDTO对象
     * @param post
     * @return
     */
    PostEsDTO getDto(Post post);

    /**
     * 将从ES中查询出来的数据转化成前端需要的数据
     *
     * @param postEsDTOList
     * @param keyword
     * @return
     */
    Page<PostVO> getResult(Page<PostEsDTO> postEsDTOList, String keyword,String username);

    /**
     *  将 PictureEsDTO列表 转换成 PostVO列表
     * @param pictureEsDTOList 需要传入的PictureEsDTO列表
     * @param postQuery 搜素关键词
     * @return 返回PostVO列表
     */
    Page<PostVO> picEsListToPostVOPage(List<PictureEsDTO> pictureEsDTOList, PostQuery postQuery);

    /**
     * 点赞功能
     */
    int giveAlike(String filename, String username);

    /**
     * 点踩功能
     */
    int giveAdislike(String filename, String username);

    /**
     * 根据用户填入的标签进行搜索
     * @param postQuery
     * @return
     */
    Page<Post> selectByTags(PostQuery postQuery);


    /**
     * 对从数据库中得到的数据进行封装，转换成前端需要的数据
     * @param postPage  从数据库中得到的分页数据
     * @param postQuery  用户的查询条件，主要是用到其中的用户名和标签
     * @return  返回封装好的要返回给前端的数据
     */
    Page<PostByTagVO> getResultByTag(Page<Post> postPage, PostQuery postQuery);

    boolean addDownloadNum(String fileName);
}
